/*
* Copyright (C) 2006, 2007 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 14. March 2006 by Joerg Schaible
*/
package com.thoughtworks.xstream.testutil;
import java.security.AccessControlContext;
import java.security.CodeSource;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @author Jörg Schaible
*/
public class DynamicSecurityManager extends SecurityManager {
private Map permissions = new HashMap();
private AccessControlContext acc = null;
private List failedPermissions = new ArrayList();
public void addPermission(final CodeSource codeSource, final Permission permission) {
PermissionCollection permissionCollection = (PermissionCollection)permissions
.get(codeSource);
if (permissionCollection == null) {
permissionCollection = new Permissions();
permissions.put(codeSource, permissionCollection);
}
permissionCollection.add(permission);
// updateACC();
}
public void setPermissions(
final CodeSource codeSource, final PermissionCollection permissionCollection) {
if (permissionCollection == null) {
if (permissions.remove(codeSource) != null) {
// updateACC();
}
} else {
if (permissions.put(codeSource, permissionCollection) != null) {
// updateACC();
}
}
}
private void updateACC() {
if (permissions.size() == 0) {
acc = null;
} else {
final ProtectionDomain[] domains = new ProtectionDomain[permissions.size()];
int i = 0;
for (final Iterator iter = permissions.keySet().iterator(); iter.hasNext();) {
final CodeSource codeSource = (CodeSource)iter.next();
final PermissionCollection permissionCollection = (PermissionCollection)permissions
.get(codeSource);
domains[i++] = new ProtectionDomain(codeSource, permissionCollection);
}
acc = new AccessControlContext(domains);
}
}
public void setReadOnly() {
updateACC();
}
public void checkPermission(Permission perm) {
if (acc != null) {
try {
checkPermission(perm, acc);
} catch (final SecurityException e) {
failedPermissions.add(perm);
throw e;
}
}
}
public List getFailedPermissions() {
return Collections.unmodifiableList(failedPermissions);
}
}